之前,有介紹過如何自訂ListView列表項目,當時是直接用已經宣告好的陣列來連結在一起。可是,這是就沒有可以變化的地方。例如:可以從資料庫取得資料,轉成JSON字串,回傳到Android。但是,要如何將JSON字串轉成ArrayList物件。再跟ListView結合起來。
如何自訂ListView,請參考我之前的文章。而這次修改好、完整的程式碼,如下所述。有跟之前不同的地方,請看註解。
public class MainActivity extends AppCompatActivity {
    ListView lsv_sports;
    ArrayList<Integer> aryimas;
    ArrayList<String> arysport;
    ArrayList<String> aryengsport;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lsv_sports = (ListView)findViewById(R.id.lsvsports);
        aryimas=new ArrayList<>();
        arysport=new ArrayList<>();
        aryengsport=new ArrayList<>();
        String strjson = "[{\"cname\":\"籃球\",\"ename\":\"basketball\"},{\"cname\":\"足球\",\"ename\":\"soccer\"},{\"cname\":\"排球\",\"ename\":\"volleyball\"}]";
        try{
            //將JSON字串,放到JSONArray中。
            JSONArray array = new JSONArray(strjson);
            //解出JSON的資料,將所要的資料,再寫入陣列中。
            for (int i = 0; i < array.length(); i++) {
                JSONObject jsonObject = array.getJSONObject(i);
                String strcname = jsonObject.getString("cname");
                String strename = jsonObject.getString("ename");
                aryimas.add(R.drawable.ball01);
                arysport.add(strcname);
                aryengsport.add(strename);
            }
        }
        catch(JSONException e) {
            e.printStackTrace();
        }
        // 建立自訂的 Adapter
        listlayoutadapter adasports=new listlayoutadapter(this);
        // 設定 ListView 的資料來源
        lsv_sports.setAdapter(adasports);
    }
    //自訂listlayoutadapter,繼承 BaseAdapter。
    //再實做出 getCount、getItem、getitemid、getView函式。
    public class listlayoutadapter extends BaseAdapter {
        private LayoutInflater listlayoutInflater;
        public listlayoutadapter(Context c){
            listlayoutInflater = LayoutInflater.from(c);
        }
        @Override
        public int getCount() {
            //取得ArrayList的總數 (要注意,跟array不同之處)
            return arysport.size();
        }
        @Override
        public Object getItem(int position) {
            //要用get(position)取得資料 (要注意,跟array不同之處)
            return  arysport.get(position);
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            convertView = listlayoutInflater.inflate(R.layout.listlayout,null);
            //設定自訂樣板上物件對應的資料。
            ImageView img_logo = (ImageView) convertView.findViewById(R.id.imglogo);
            TextView lbl_name = (TextView) convertView.findViewById(R.id.lblname);
            TextView lbl_engname = (TextView) convertView.findViewById(R.id.lblengname);
            //要用get(position)取得資料 (要注意,跟array不同之處)
            img_logo.setImageResource(aryimas.get(position));
            lbl_name.setText(arysport.get(position));
            lbl_engname.setText(aryengsport.get(position));
            return convertView;
        }
    }
}
執行起來的畫面: